package cl.sodexo.com.action;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import cl.sodexo.com.delegate.DetalleDelegate;
import cl.sodexo.com.dto.Estado;
import cl.sodexo.com.dto.Requerimiento;
import cl.sodexo.com.dto.Usuario;
import cl.sodexo.com.form.DetalleRequerimientoForm;
import cl.sodexo.com.utils.Constantes;

public class DetalleRequerimientoAction extends AbstractManagerDAO{
	
	private static final Logger logger = Logger.getLogger(DetalleRequerimientoAction.class);
	private static final String DETALLE= "detalle";
	private static final String OBJ	   = "reqObj";
	private static final String ACTION = "action";
	private static final String UPDATE = "Enviar";

	public ActionForward execute(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		HttpSession session	= request.getSession();
		Usuario user		= (Usuario) session.getAttribute(Constantes.USEROBJ); 
		
		if(request.getSession().getAttribute(Constantes.SESSION) == null){
			return mapping.findForward(Constantes.ERROR);
		}else if(!(Boolean) request.getSession().getAttribute(Constantes.SESSION)){
			return mapping.findForward(Constantes.ERROR); //TODO verificar página de dirección login
		}else if(!user.getPerfil().getIdPerfil().equals(Constantes.OP)
				&& !user.getPerfil().getIdPerfil().equals(Constantes.USER)
				&& !user.getPerfil().getIdPerfil().equals(Constantes.JEFE)
				&& !user.getPerfil().getIdPerfil().equals(Constantes.ADMIN)){
			return mapping.findForward(Constantes.ERROR); //TODO verificar página de dirección login
		}else{
			String keyLoad	= request.getParameter(DETALLE);
			String action	= request.getParameter(ACTION);
    		logger.info("keyLoad: " + keyLoad);
    		logger.info("action: " + action);
    		
    		DetalleRequerimientoForm detalleForm = (DetalleRequerimientoForm) form;
    		detalleForm.setListJefesProyecto(super.getUsuarioDAO().listUsuariosPerfil(Constantes.OP));
    		detalleForm.setListEstados(super.getEstadoDAO().listaEstados());
    		
    		if(user.getPerfil().getIdPerfil().equals(Constantes.JEFE)){
    			detalleForm.setJefatura(true);
    			request.setAttribute("volverAction", "jefaturaRequerimientos.do");
    		}else{
    			detalleForm.setJefatura(false);
    			request.setAttribute("volverAction", "continuidadOperativa.do");
    		}
    		
    		if(keyLoad != null){
        		this.completeFields(detalleForm, keyLoad, mapping, request);
        		detalleForm.setEstadoSelectItem(detalleForm.getReqTO().getEstado().getIdEstado());
    			detalleForm.setJefeSelectItem(detalleForm.getReqTO().getJefeProyecto().getIdUsuario());
    			session.setAttribute(OBJ, detalleForm.getReqTO());
    		}else if(action != null && action.equals(UPDATE)){
    			this.loadRequerimiento(detalleForm, (Requerimiento) session.getAttribute(OBJ));
    			this.loadEstado(detalleForm);
				this.loadJefe(detalleForm);
    			
    			String mensaje	= this.editRequerimiento(detalleForm.getReqTO());
    			
    			if(mensaje.equals("") 
    					&& super.getRequerimientoDAO().updateRequerimientoOperativo(detalleForm.getReqTO())){
    				mensaje = "Requerimiento ID: " + detalleForm.getReqTO().getIdRequerimiento() + " ha sido actualizado";
    				
    				if(detalleForm.getReqTO().getEstado().getIdEstado().equals("4")){
    					DetalleDelegate delegate = new DetalleDelegate();
        				delegate.sendMail("psep.pentauc@gmail.com"); //TODO cargado de jespa
    				}
    				
    				if(!user.getPerfil().getIdPerfil().equals(Constantes.JEFE)){
    					detalleForm.setUrl("continuidadOperativa.do");
    				}else{
    					detalleForm.setUrl("jefaturaRequerimientos.do");
    				}
    				
    				this.completeFields(detalleForm, detalleForm.getReqTO().getIdRequerimiento(), mapping, request);
        			detalleForm.setEstadoSelectItem(detalleForm.getReqTO().getEstado().getIdEstado());
        			detalleForm.setJefeSelectItem(detalleForm.getReqTO().getJefeProyecto().getIdUsuario());
    			}
    			
    			detalleForm.setMessage(mensaje);
    		}
    		
    		request.setAttribute("disabled", detalleForm.getJefatura()); 
    		
    	    return mapping.findForward(Constantes.SUCCESS);
		}
	}
	
	/**
	 * @param detalleForm
	 */
	private void loadEstado(DetalleRequerimientoForm detalleForm){
		Estado estadoTO = new Estado();
		estadoTO.setIdEstado(detalleForm.getEstadoSelectItem());
		detalleForm.getReqTO().setEstado(estadoTO);
	}
	
	/**
	 * @param detalleForm
	 */
	private void loadJefe(DetalleRequerimientoForm detalleForm){
		Usuario jefeTO	= new Usuario();
		jefeTO.setIdUsuario(detalleForm.getJefeSelectItem());
		detalleForm.getReqTO().setJefeProyecto(jefeTO);
	}
	
	/**
	 * @param detalleForm
	 * @param req
	 */
	private void loadRequerimiento(DetalleRequerimientoForm detalleForm, Requerimiento req){
		detalleForm.getReqTO().setIdRequerimiento(req.getIdRequerimiento());
		detalleForm.getReqTO().setUsuarioSolicitante(req.getUsuarioSolicitante());
		detalleForm.getReqTO().setJefaturaGral(req.getJefaturaGral());
		detalleForm.getReqTO().setTipoRequerimiento(req.getTipoRequerimiento());
		detalleForm.getReqTO().setFechaIngreso(req.getFechaIngreso());
		detalleForm.getReqTO().setDetalle(req.getDetalle());
	}
	
	/**
	 * @param detalleFrm
	 * @param key
	 * @param mapping
	 * @param request
	 * @throws Exception
	 */
	private void completeFields(DetalleRequerimientoForm detalleFrm, 
					String key, ActionMapping mapping, HttpServletRequest request) throws Exception{
		Requerimiento req = new Requerimiento();
		req.setIdRequerimiento(key);
		ArrayList<Requerimiento> listReq = super.getRequerimientoDAO().getRequerimientosJefatura(req);
		
		if(listReq.size() > 0){
			detalleFrm.setReqTO(listReq.get(0));
			request.setAttribute("urlFile", detalleFrm.getReqTO().getFilePath());
		}
	}
	
	/**
	 * @param req
	 * @return
	 */
	private String editRequerimiento(Requerimiento req){
		String validator = "";
		
		if(req.getRespuesta() == null || req.getRespuesta().trim().equals("")){
			validator = "Debe ingresar una respuesta al requerimiento";
		}else if(req.getTiempoEstimado() == null || req.getTiempoEstimado().trim().equals("")){
			validator = "Debe ingresar un tiempo estimado";
		}else if(req.getFechaEntrega() == null || req.getFechaEntrega().trim().equals("")){
			validator = "Debe ingresar fecha de entrega";
		}else if(req.getJefeProyecto().getIdUsuario() == null || req.getJefeProyecto().getIdUsuario().trim().equals("0")){
			validator = "Debe seleccionar Jefe de Proyecto";
		}else if(req.getEstado().getIdEstado() == null || req.getEstado().getIdEstado().trim().equals("0")){
			validator = "Debe seleccionar un estado";
		}else{
			
		}
		
		return validator;
	}
	
}
